home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1999 #2 / Amiga Plus CD - 1999 - No. 2.iso / System-Boost / Workbench / Archive / XPK / xpk_Source / test / testChunkyPack.c < prev    next >
C/C++ Source or Header  |  1998-11-15  |  4KB  |  151 lines

  1. #define NAME        "testChunkyPack"
  2. #define DISTRIBUTION    "(Freeware) "
  3. #define REVISION    "0"
  4.  
  5. /* Programmheader
  6.  
  7.     Name:        testChunkyPack
  8.     Author:        SDI
  9.     Distribution:    Freeware
  10.     Description:    tests chunky packing using XpkWrite
  11.     Compileropts:    -
  12.     Linkeropts:    -l xpkmaster amiga
  13.  
  14.  1.0   26.08.98 : first version
  15. */
  16.  
  17. /* The working method of this program is useful especially for games, as it
  18. is designed mainly to store internal structures part for part into an file.
  19.  
  20. For correct working you need to use at least xpkmaster.library 5! */
  21.  
  22. #include <proto/exec.h>
  23. #include <proto/dos.h>
  24. #include <proto/xpkmaster.h>
  25. #include <exec/memory.h>
  26. #include <exec/execbase.h>
  27. #include "SDI_defines.h"
  28.  
  29. struct Library        *XpkBase        = 0;
  30. ULONG            DosVersion        = 37;
  31.  
  32. #define CHUNKSIZE    10240
  33. /* NOTE: this chunksize define is the value passed to XpkOpen. It is NOT
  34. the value, which is used, as xpk may change this internally depending on
  35. the packing algorithm, so we need to check xfib->xf_NLen value to get
  36. buffer size! */
  37.  
  38. /* USER modus cannot be used with this system, as we have no input data
  39. ready, when we start crunching. */
  40.  
  41. #define PARAM "TO/A,METHOD"
  42.  
  43. struct Args {
  44.   STRPTR to;
  45.   STRPTR method;
  46. };
  47.  
  48. struct BufData {
  49.   STRPTR       buffer;
  50.   ULONG         filled;
  51.   LONG         err;
  52.   struct XpkFib *xfib;
  53. };
  54.  
  55. extern struct DosLibrary *DOSBase;
  56. extern struct ExecBase *  SysBase;
  57.  
  58. LONG SaveData(struct BufData *b, APTR buf, ULONG size);
  59.  
  60. void main(void)
  61. {
  62.   struct Args args = {0,"NUKE"}; /* defaults */
  63.   struct RDArgs *rda;
  64.  
  65.   if((rda = ReadArgs(PARAM, (LONG *) &args, 0)))
  66.   {
  67.     if((XpkBase = OpenLibrary(XPKNAME, 5)))
  68.     {
  69.       struct BufData b;
  70.       LONG err;
  71.  
  72.       if(!(err = XpkOpenTags(&b.xfib, XPK_PackMethod, args.method,
  73.       XPK_OutName, args.to, XPK_ChunkSize, CHUNKSIZE, XPK_Preferences, 0,
  74.       TAG_DONE)))
  75.       {
  76.         if((b.buffer = (STRPTR) AllocVec(b.xfib->xf_NLen, MEMF_ANY)))
  77.         {
  78.           b.filled = 0;
  79.           b.err    = 0;
  80.  
  81.       /* this is a test, saving some really useless stuff */
  82.       {
  83.         ULONG a = *((ULONG *)(((STRPTR) 0x1000000)-20));
  84.  
  85.         SaveData(&b, "IDXTCP10", 8); /* an ID value to detect our data */
  86.         SaveData(&b, "This is the DOSBase:", 21);
  87.         SaveData(&b, DOSBase, sizeof(struct DosLibrary));
  88.         SaveData(&b, "This is the SysBase:", 21);
  89.         SaveData(&b, SysBase, sizeof(struct ExecBase));
  90.         Printf("Storing kickrom, this will take some time\n");
  91.         SaveData(&b, "This is the kickrom:", 21);
  92.         SaveData(&b, ((STRPTR) 0x1000000)-a, a);
  93.         if(err = SaveData(&b, 0, 0))
  94.           XpkPrintFault(err, 0);
  95.       }
  96.           
  97.           FreeVec(b.buffer);
  98.         }
  99.         XpkClose(b.xfib);
  100.       }
  101.       else
  102.         XpkPrintFault(err, 0);
  103.       CloseLibrary(XpkBase);
  104.     }
  105.     FreeArgs(rda);
  106.   }
  107. }
  108.  
  109. /* Call this function for every data to store, calling it with size zero
  110. means all data is done and the last stuff should be stored in file.
  111.  
  112. This function uses a delayed error report, so we need not check every call.
  113. SaveData does nothing except returning the error again, when an error
  114. occured a call before. */
  115. LONG SaveData(struct BufData *b, APTR buf, ULONG size)
  116. {
  117.   LONG i;
  118.  
  119.   if(!size && !b->err) /* end the packed file */
  120.   {
  121.     if(b->filled)
  122.     {
  123.       i = XpkWrite(b->xfib, b->buffer, b->filled);
  124.       b->filled = 0;
  125.       return i;
  126.     }
  127.     else
  128.       return 0;
  129.   }
  130.  
  131.   while(size && !b->err)
  132.   {
  133.     if((i = b->xfib->xf_NLen - b->filled) > size)
  134.       i = size;
  135.  
  136.     CopyMem(buf, b->buffer+b->filled, i);
  137.     b->filled += i;
  138.     size -= i;
  139.     buf = ((STRPTR) buf) + i;
  140.  
  141.     if(b->filled == b->xfib->xf_NLen)
  142.     {
  143.       b->err = XpkWrite(b->xfib, b->buffer, b->filled);
  144.       b->filled = 0;
  145.     }
  146.   }
  147.  
  148.   return b->err;
  149. }
  150.  
  151.